"""前面两篇介绍了分类模型评估的两类方法，准确率分析和损失分析，
本篇介绍的杰卡德相似系数和马修斯相关系数为我们提供了不同的角度来观察模型的性能，
尤其在不平衡数据场景中，它们更能体现出其独特的价值。

接下来，让我们一起了解这两个评估指标的原理与特点。

1. 杰卡德相似系数
杰卡德相似系数（Jaccard similarity coefficient）用于衡量两个集合的相似度。
在分类模型中，通常将每个类别看作一个集合，然后计算模型预测结果与实际结果之间的杰卡德相似系数。

杰卡德相似系数能够直观地反映模型预测的准确性，并且对于不平衡数据集具有一定的鲁棒性。
它特别适用于二元分类问题，但也可以扩展到多类分类问题中。

1.1. 计算公式
J(y,^y)=|y∩^y||y∪^y|其中，y是真实值，^y是预测值。

1.2. 使用示例"""

import numpy as np
from sklearn.metrics import jaccard_score
from sklearn.metrics import matthews_corrcoef

n = 100
k = 2
y_true = np.random.randint(0, k, n)
y_pred = np.random.randint(0, k, n)

s = jaccard_score(y_true, y_pred)
print("jaccard score：{}".format(s))
"""
# 运行结果：
jaccard score：0.36585365853658536
上面的示例中，是针对二分类数据（k=2）来计算杰卡德相似系数的。

如果是多分类的数据，需要设置jaccard_score的average参数，否则会报错。
average参数主要有以下选项：

binary：仅当目标 是二分类时才适用
micro：通过计算总的真阳性、假阴性和假阳性来计算全局指标
macro：计算每个标签的指标，并找到它们的未加权平均值
weighted：计算每个标签的指标，并找到其平均值，并按支持度（每个标签的真实实例数）加权
samples：计算每个实例的指标，并找到它们的平均值（仅对多标签分类有意义）"""

n = 100
k = 5
y_true = np.random.randint(0, k, n)
y_pred = np.random.randint(0, k, n)

s1 = jaccard_score(y_true, y_pred, average="micro")
s2 = jaccard_score(y_true, y_pred, average="macro")
s3 = jaccard_score(y_true, y_pred, average="weighted")
print("jaccard score：\nmicro：{}\nmacro：{}\nweighted：{}".format(s1, s2, s3))
"""
# 运行结果：
jaccard score：
micro：0.0989010989010989
macro：0.09772727272727273
weighted：0.09639935064935062
上面的示例是多分类的情况，不设置 average参数的话，会报错。

2. 马修斯相关系数
马修斯相关系数（Matthews correlation coefficient）是一种用于衡量二分类模型性能的指标，
它考虑了真阳性（TP）、真阴性（TN）、假阳性（FP）和假阴性（FN）四个方面的信息。

马修斯相关系数对于不平衡数据集具有较好的适应性，并且能够综合考虑模型的真正例率和真负例率。
与准确率、召回率等指标相比，马修斯相关系数在处理不平衡数据集时更为可靠。

2.1. 计算公式
MCC=tp×tn−fp×fn√(tp+fp)(tp+fn)(tn+fp)(tn+fn)关于 tp，tn，fp，fn
的概念，参见下表：


实际结果（真）	实际结果（假）
预测结果（真）	tp（true positive）真阳性	fp（false positive）假阳性
预测结果（假）	fn（false negative）假阴性	tn（true negative）真阴性
2.2. 使用示例"""

n = 100
k = 2
y_true = np.random.randint(0, k, n)
y_pred = np.random.randint(0, k, n)

s = matthews_corrcoef(y_true, y_pred)
print("matthews corrcoef：{}".format(s))

"""# 运行结果
matthews corrcoef：0.028231544780468854
上面示例中，用的随机样本数据是二分类（k=2）的，不过，马修斯相关系数对多分类数据也是支持的。

3. 总结
总的来说，杰卡德相似系数和马修斯相关系数为我们提供了更全面、更深入的分类模型性能评估视角。
尤其是在处理不平衡数据集时，这两个指标的表现尤为突出。

杰卡德相似系数从集合相似度的角度展现了模型的预测准确性，
而马修斯相关系数则综合考虑了各类别的预测情况，为模型的整体性能给出了更为准确的反馈。"""
